/**
 * 变量数据的移动
 */
fn main() {
    // 整数类型为 i32，存放在栈上，赋值操作执行复制语义
    let x = 5;
    let y = x;
    println!("x = {}, y = {}", x, y);

    // 字符串字面值类型为 &strl，存放在栈上，赋值操作执行复制语义
    let str1 = "hello";
    let str2 = str1;
    println!("str1 = {}, str2 = {}", str1, str2);

    // String 类型，存放在堆上，赋值操作执行移动语义
    let s1 = String::from("hello");
    println!("移动前 s1 = {}", s1);
    let s2 = s1;
    // println!("移动后 s1 = {}", s1); // value borrowed here after move
    println!("移动后 s2 = {}", s2);
    // 克隆 String 类型，执行深拷贝，s2 与 s3 指向不同的内存地址，s2 与 s3 是两个独立的 String 类型变量
    let s3 = s2.clone();
    println!("克隆后 s2 = {}, s3 = {}", s2, s3);
}
